bitkeeper revision 1.1159.45.14 (412629e8AO8Ty3LNUQeMVLVbHFMAQQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Fri, 20 Aug 2004 16:42:16 +0000 (16:42 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Fri, 20 Aug 2004 16:42:16 +0000 (16:42 +0000)
Fix SET_FOREIGNDOM

xen/arch/x86/memory.c

index 5152e396480a8bb77d4841925c43fd55b9404777..1cced82a7d34e7c24827625b4414e131ab21c949 100644 (file)
@@ -864,12 +864,17 @@ static int do_extended_command(unsigned long ptr, unsigned long val)
     case MMUEXT_SET_FOREIGNDOM:
         domid = (domid_t)(val >> 16);
 
+        if ( (e = percpu_info[cpu].foreign) != NULL )
+            put_domain(e);
+        percpu_info[cpu].foreign = NULL;
+
         if ( !IS_PRIV(d) )
         {
             switch ( domid )
             {
             case DOMID_IO:
-                get_knownalive_domain(e = dom_io);
+                get_knownalive_domain(dom_io);
+                percpu_info[cpu].foreign = dom_io;
                 break;
             default:
                 MEM_LOG("Dom %u cannot set foreign dom\n", d->domain);
@@ -879,19 +884,18 @@ static int do_extended_command(unsigned long ptr, unsigned long val)
         }
         else
         {
-            if ( (e = percpu_info[cpu].foreign) != NULL )
-                put_domain(e);
-
             percpu_info[cpu].foreign = e = find_domain_by_id(domid);
             if ( e == NULL )
             {
                 switch ( domid )
                 {
                 case DOMID_XEN:
-                    get_knownalive_domain(e = dom_xen);
+                    get_knownalive_domain(dom_xen);
+                    percpu_info[cpu].foreign = dom_xen;
                     break;
                 case DOMID_IO:
-                    get_knownalive_domain(e = dom_io);
+                    get_knownalive_domain(dom_io);
+                    percpu_info[cpu].foreign = dom_io;
                     break;
                 default:
                     MEM_LOG("Unknown domain '%u'", domid);